package com.along.utility.common.utils;

import java.io.Serializable;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

/**
 * 时间工具类
 *
 * @author jingjiwu
 * @date 2018年11月22日 下午4:08:54
 */
public class DateUtils implements Serializable {

	private static final long serialVersionUID = 1L;
	private static final String YYYYMMDD = "yyyyMMdd";
	private DateUtils(){}

	/**
	 * 获取指定日期的为周几
	 * 1：星期一，2：星期二，3：星期三，4：星期四；5：星期五；6：星期六；7：星期日
	 * @param date
	 * @return
	 * @author haojianjian
	 * @date 2021-03-10 15:18:43
	 *
	 */
	public static int getWeekOfDate(Date date){
		Calendar cal = Calendar.getInstance();
		cal.setTime(date);
		int w = cal.get(Calendar.DAY_OF_WEEK) -1;
		if(w == 0) w = 7;
		return w;
	}

	/**
	 * 取当前日期的小时数
	 *
	 * @param date
	 * @return
	 * @author jingjiwu
	 * @date 2018年12月16日 上午12:28:34
	 */
	public static int getHour(Date date) {
		LocalTime lt = date.toInstant().atZone(ZoneId.systemDefault()).toLocalTime();
		return lt.getHour();
	}

	/**
	 * 取当前日期的分钟数
	 *
	 * @param date
	 * @return
	 * @author jingjiwu
	 * @date 2018年11月22日 下午4:11:47
	 */
	public static int getMinute(Date date) {
		LocalTime lt = date.toInstant().atZone(ZoneId.systemDefault()).toLocalTime();
		return lt.getMinute();
	}

	/**
	 * 时间戳(s)取分钟数
	 *
	 * @param date
	 * @return
	 * @author jingjiwu
	 * @date 2020年1月10日 下午3:05:05
	 */
	public static int getMinute(long date) {
		LocalDateTime ldt = LocalDateTime.ofEpochSecond(date, 0, ZoneOffset.of("+8"));
		return ldt.getMinute();
	}

	/**
	 * 取当前日期的秒数
	 *
	 * @param date
	 * @return
	 * @author jingjiwu
	 * @date 2018年11月22日 下午4:15:39
	 */
	public static int getSecond(Date date) {
		LocalTime lt = date.toInstant().atZone(ZoneId.systemDefault()).toLocalTime();
		return lt.getSecond();
	}

	/**
	 * 时间戳(s)取秒数
	 *
	 * @param date
	 * @return
	 * @author jingjiwu
	 * @date 2020年1月10日 下午3:06:38
	 */
	public static int getSecond(long date) {
		LocalDateTime ldt = LocalDateTime.ofEpochSecond(date, 0, ZoneOffset.of("+8"));
		return ldt.getSecond();
	}

	/**
	 * 取当前日期的月份
	 *
	 * @param date
	 * @return
	 * @author jingjiwu
	 * @date 2018年11月22日 下午4:17:44
	 */
	public static int getMonth(Date date) {
		LocalDate lt = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
		return lt.getMonthValue();
	}

	/**
	 * 取当前日期的日
	 *
	 * @param date
	 * @return
	 * @author jingjiwu
	 * @date 2018年12月31日 下午9:01:30
	 */
	public static int getDay(Date date) {
		LocalDate lt = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
		return lt.getDayOfMonth();
	}

	/**
	 * 取当前日期的年份
	 *
	 * @param date
	 * @return
	 * @author jingjiwu
	 * @date 2018年11月22日 下午4:17:55
	 */
	public static int getYear(Date date) {
		LocalDate lt = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
		return lt.getYear();
	}

	/**
	 * 取日期的yyyyMMdd的整数形式
	 *
	 * @param date
	 * @return
	 * @author jingjiwu
	 * @date 2019年3月11日 下午1:39:38
	 */
	public static int getYearMonthDay(Date date) {
		LocalDate ld = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
		return Integer.parseInt(ld.format(DateTimeFormatter.ofPattern(YYYYMMDD)));
	}

	/**
	 * 对指定的日期增加或减少指定的秒数
	 *
	 * @param date
	 * @param second
	 * @return
	 * @author jingjiwu
	 * @date 2018年12月3日 下午4:04:33
	 */
	public static Date addSecond(Date date, int second) {
		LocalDateTime ldt = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
		return Date.from(ldt.plusSeconds(second).atZone(ZoneId.systemDefault()).toInstant());
	}

	public static long addSecond(long date, int second) {
		return date + second;
	}

	/**
	 * 对指定的日期增加或减少指定的天数
	 *
	 * @param date
	 * @param day
	 * @return
	 * @author jingjiwu
	 * @date 2019年1月10日 下午2:50:25
	 */
	public static Date addDay(Date date, int day) {
		LocalDateTime ldt = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
		return Date.from(ldt.plusDays(day).atZone(ZoneId.systemDefault()).toInstant());
	}

	public static long addDay(long date, int day) {
		LocalDateTime ldt = LocalDateTime.ofEpochSecond(date, 0, ZoneOffset.of("+8"));
		return ldt.plusDays(day).toEpochSecond(ZoneOffset.of("+8"));
	}

	/**
	 * 两个时间相减
	 *
	 * @param datePre
	 * @param dateNext
	 * @return 差值-秒数
	 * @author jingjiwu
	 * @date 2018年12月18日 下午5:21:01
	 */
	public static long sub(Date datePre, Date dateNext) {
		return (datePre.getTime() - dateNext.getTime()) / 1000;
	}

	/**
	 * 两个时间戳（s）相减
	 *
	 * @param datePre
	 * @param dateNext
	 * @return
	 * @author jingjiwu
	 * @date 2020年1月10日 下午2:56:22
	 */
	public static long sub(long datePre, long dateNext) {
		return datePre - dateNext;
	}

	public static long getSubDay(Date datePre, Date dateNext) {
		return (datePre.getTime() - dateNext.getTime()) / (24 * 60 * 60 * 1000);
	}

	/**
	 * date格式化成字符串
	 *
	 * @param date
	 * @param sdf
	 * @return
	 * @author jingjiwu
	 * @date 2018年12月15日 下午11:54:19
	 */
	public static String formatDateToString(Date date, String format) {
		LocalDateTime ldt = LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
		return ldt.format(DateTimeFormatter.ofPattern(format));
	}

	/**
	 * 时间戳(秒)转字符串
	 *
	 * @param date
	 * @param format
	 * @return
	 * @author jingjiwu
	 * @date 2020年1月10日 下午1:43:41
	 */
	public static String formatDateToString(long date, String format) {
		LocalDateTime ldt = LocalDateTime.ofEpochSecond(date, 0, ZoneOffset.of("+8"));
		return ldt.format(DateTimeFormatter.ofPattern(format));
	}

	/**
	 * 时间戳(秒)
	 *
	 * @param date
	 * @return
	 * @author jingjiwu
	 * @date 2020年1月10日 下午1:46:12
	 */
	/*
	 * public static Date formatLongToDate(long date){ LocalDateTime ldt =
	 * LocalDateTime.ofEpochSecond(date, 0, ZoneOffset.of("+8")); return
	 * Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant()); }
	 */

	/**
	 * 时间戳(毫秒)
	 *
	 * @param date
	 * @return
	 * @author jingjiwu
	 * @date 2020年2月6日 下午4:56:37
	 */
	public static Date formatLongToDate(Long date) {
		LocalDateTime ldt = LocalDateTime.ofInstant(Instant.ofEpochMilli(date), ZoneOffset.of("+8"));
		return Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
	}

	/**
	 * 字符串格式化成Date年月日时分秒形式
	 *
	 * @param date
	 * @param format
	 * @return
	 * @author jingjiwu
	 * @date 2019年3月11日 下午1:40:08
	 */
	public static Date formatStringToDateTime(String date, String format) {
		LocalDateTime ldt = LocalDateTime.parse(date, DateTimeFormatter.ofPattern(format));
		return Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
	}

	/**
	 * 字符串格式化成Date年月日形式
	 *
	 * @param date
	 * @param format
	 * @return
	 * @author jingjiwu
	 * @date 2019年3月11日 下午1:40:51
	 */
	public static Date formatStringToDate(String date, String format) {
		LocalDate ld = LocalDate.parse(date, DateTimeFormatter.ofPattern(format));
		return Date.from(ld.atStartOfDay(ZoneId.systemDefault()).toInstant());
	}

	/**
	 * 字符串(年月日)转换成时间戳(秒)
	 *
	 * @param date
	 * @param format
	 * @return
	 * @author jingjiwu
	 * @date 2020年1月10日 下午1:59:45
	 */
	public static long formatDateStringToSecond(String date, String format) {
		LocalDate ld = LocalDate.parse(date, DateTimeFormatter.ofPattern(format));
		return ld.atStartOfDay(ZoneOffset.of("+8")).toEpochSecond();
	}

}
